
package grasp;
import java.io.*;
public class Grasp 
{
    public void grasp(dgbi.BiGrafo g, int porcentaje, PrintStream archivo)
    {
        // creacion variables
        constructiva.Constructiva constructiva = new constructiva.Constructiva();
        Local.local loc = new Local.local();
        dgbi.BiGrafo solInicial = new dgbi.BiGrafo(g);                          // solInicial = Grafo inicial
        dgbi.BiGrafo mejorSol = new dgbi.BiGrafo();                             // la mejor solucion de todas las iteraciones

        int cortesSol= 0;                                   // #cortes de 1 solucion
        int Porcent = porcentaje;                                  // porcentaje para el goloso
        double tiempoInicio;
        double tiempoFinal;
        // construyo la primera solucion
        // construyo la primera solucion
        constructiva.ContructivaAlgoGrasp(g, Porcent);
        cortesSol = loc.Busqlocal(g);
        mejorSol.copiar(g);

        int mejorCantCortes = cortesSol;
        double n = g.v1.size()+g.v2.size();
        //#cortes de la mejor solucion
        double iteracionesAux = 2* Math.log(n)/Math.log(2);
        int iteraciones /*= (int) iteracionesAux*/;
        if (Porcent!=100)
            iteraciones = 13;
        else
            iteraciones=1;
 
        int iter=iteraciones;
        constructiva.ContructivaAlgoGrasp(g, Porcent);
        cortesSol = loc.Busqlocal(g);
        mejorSol.copiar(g);
        tiempoInicio= System.currentTimeMillis();
        mejorCantCortes = cortesSol;                    //#cortes de la mejor solucion

        while(iteraciones > 0)
        {
            constructiva.ContructivaAlgoGrasp(g, Porcent);
            cortesSol = loc.Busqlocal(g);
            if(cortesSol < mejorCantCortes)
            {
                mejorSol.copiar(g);
                mejorCantCortes = cortesSol;
            }
            iteraciones--;
            g.copiar(solInicial);

            tiempoFinal = System.currentTimeMillis();
            double tiempo = tiempoFinal - tiempoInicio;
            archivo.print("V1 " +  mejorSol.cantElementosOriginalV1 + " V2 " + mejorSol.cantElementosOriginalV2 + " iV1 " + mejorSol.cantElementosOriginaliV1 + " iV2 " + mejorSol.cantElementosOriginaliV2 + " CantEjesFijo " + mejorSol.cantEjesFijo + " CantidadEjesParticion " + mejorSol.cantEjesParticionAAgregar+" Cortes " + mejorSol.cruces + " Op " + mejorSol.cantOpertaciones + " T " + tiempo+" Iteraciones grasp: "+String.valueOf(iter-iteraciones)+" porcentaje Goloso: "+ String.valueOf(Porcent) +"\n" );
        }
        g.copiar(mejorSol);
        System.out.println("mejorCantCortes: "+mejorCantCortes);
    }
    public void grasp(dgbi.BiGrafo g)
    {
        // creacion variables
        constructiva.Constructiva constructiva = new constructiva.Constructiva();
        Local.local loc = new Local.local();
        dgbi.BiGrafo solInicial = new dgbi.BiGrafo(g);                          // solInicial = Grafo inicial
        dgbi.BiGrafo mejorSol = new dgbi.BiGrafo();                             // la mejor solucion de todas las iteraciones

        int cortesSol= 0;                                   // #cortes de 1 solucion
        int Porcent = 20;                                  // porcentaje para el goloso
        double tiempoInicio;
        double tiempoFinal;
        // construyo la primera solucion
        // construyo la primera solucion
        constructiva.ContructivaAlgoGrasp(g, Porcent);
        cortesSol = loc.Busqlocal(g);
        mejorSol.copiar(g);

        int mejorCantCortes = cortesSol;
        double n = g.v1.size()+g.v2.size();
        //#cortes de la mejor solucion
        double iteracionesAux = 2* Math.log(n)/Math.log(2);
        int iteraciones = (int) iteracionesAux;
        /*if (Porcent!=100)
            iteraciones = 13;
        else
            iteraciones=1;*/
 
        int iter=iteraciones;
        constructiva.ContructivaAlgoGrasp(g, Porcent);
        cortesSol = loc.Busqlocal(g);
        mejorSol.copiar(g);
        tiempoInicio= System.currentTimeMillis();
        mejorCantCortes = cortesSol;                    //#cortes de la mejor solucion

        while(iteraciones > 0)
        {
            constructiva.ContructivaAlgoGrasp(g, Porcent);
            cortesSol = loc.Busqlocal(g);
            if(cortesSol < mejorCantCortes)
            {
                mejorSol.copiar(g);
                mejorCantCortes = cortesSol;
            }
            iteraciones--;
            g.copiar(solInicial);
        }
        g.copiar(mejorSol);
        System.out.println("mejorCantCortes: "+mejorCantCortes);
    }
}
